Technote 1097

Desktop Printing Revealed


ñ⁄éü

èâë„ÇÃÉoÉbÉNÉOÉâÉEÉìÉhàÛç¸ã@î\

ÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÇÃåªç›

ÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÇÃñæì˙

ñ¢óàÇÕÇ∑ÇÆÇªÇ±Ç…Ç†ÇÈ

DesktopPrinting.h

DTPSample.c

DZÇÃÉeÉNÉjÉJÉãÉmÅ[ÉgÇÕ1997îN2åéÇ…î≠çsÇ≥ÇÍÅAÉvÉäÉìÉ^ÉhÉâÉCÉoäJî≠é“Ç™ÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ã@î\Ç…ëŒâûÇ∑ÇÈÇΩÇflÇÃèÓïÒÇ™ãLèqÇ≥ÇÍǃǢNjǵÇΩÅBMac OS 8.5Ç≈ÇÕÉTÅ[ÉhÉpÅ[ÉeÉBêªÇÃÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^Ç™èâÇflǃÉTÉ|Å[ÉgÇ≥ÇÍÇ‹Ç∑Ç™ÅAé·ä±ÇÃédólïœçXLJÇ≤ǥǢNjÇ∑ÅBÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ã@î\Ç…ëŒâûǵÇΩÉvÉäÉìÉ^•ÉhÉâÉCÉoÇäJî≠Ç∑ÇÈç€ÇÕDZÇÃÉeÉbÉNÉmÅ[ÉgÇÃç≈êVèÓïÒÇÇ≤óòópâ∫Ç≥Ç¢ÅB

1989îNÅASystem 6ÇΔMultiFinderÇÃìoèÍÇ≈ÅAÉoÉbÉNÉOÉâÉEÉìÉhàÛç¸Ç™â¬î\ÇΔÇ»ÇËNjǵÇΩÅBìñèâÅAèëófiÇàÛç¸ÇµÇΩíºå„Ç…MacintoshÇÃÉRÉìÉgÉçÅ[ÉãÇâÒïúÇ≈Ç´ÅAìØéûÇ…ÉvÉäÉìÉ^ÉhÉâÉCÉoÇ™ÉoÉbÉNÉOÉâÉEÉìÉhÇ≈àÛç¸èàóùÇÇ∑ÇÈíˆìxÇæÇΔçlǶÇÁÇÍǃǢNjǵÇΩÇ™ÅAèâë„ÇÃÉoÉbÉNÉOÉâÉEÉìÉhàÛç¸ã@î\ÇÕíNLJǙëzëúǵÇΩÇÊÇËLJÇÕÇÈǩDžã≠óÕÇ≈džÇËÅAÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^Çä‹ÇflǃÅAåªç›ÇÃàÛç¸ÉeÉNÉmÉçÉWÅ[ëSî Ç…ÇÌÇΩÇÈäÓëbDžǻǡǃǢNjÇ∑ÅBǵǩǵÅAÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÇÃÉTÉ|Å[ÉgÇ…ä÷êSÇéùǬÉfÉxÉçÉbÉpÇ…ÇΔǡǃÇÕécîOǻDZÇΔÇ≈Ç∑Ç™ÅAÉoÉbÉNÉOÉâÉEÉìÉhàÛç¸ãZèpÇÃëÂïîï™Ç™É}ÉjÉÖÉAÉãâªÇ≥ÇÍǃǢǻǢÇÃÇ™åªèÛÇ≈Ç∑ÅB

1994îNÅAStyleWriter 1200ÉhÉâÉCÉoÇ®ÇÊÇ—LaserWriter 8.3ÇÃìoèÍÇΔÇΔLJDžÅAÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ãZèpÇ™ì±ì¸Ç≥ÇÍNjǵÇΩÅBèâä˙ÉäÉäÅ[ÉXÇ©ÇÁåªç›Ç‹Ç≈ÅAÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÇÕï°êîÇÃã@î\ägí£ÇΔïsâ¬éãëÆê´ÇLJǬÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃèWçáÇΔǵǃë∂ç›ÇµÇƒÇ´Ç‹ÇµÇΩÅBDZÇÍÇ‹Ç≈ÅAÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÇÃÉTÉ|Å[ÉgÇ…ä÷êSÇéùǬÉfÉxÉçÉbÉpÇ…ÇΔǡǃÅAÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÇÃÉCÉÅÅ[ÉWÇÕïKÇ∏ǵLJñæämǩǬÉVÉìÉvÉãǻLJÇÃÇ≈ÇÕdžÇËÇ‹ÇπÇÒÇ≈ǵÇΩÇ™ÅADZÇÃÉeÉNÉmÉçÉWÅ[Ç™è´óàìIDžLJägí£Ç≥ÇÍǃǢÇ≠íõåÛÇ™å©Ç¶ÇƒÇ´ÇΩåªç›ÅAǪÇÃãZèpÇóùâÇ∑ÇÈDZÇΔÇÕà»ëODžLJNjǵǃèdóvÇ»ñ‚ëËÇ…Ç»ÇËǬǬdžÇËÇ‹Ç∑ÅB

DZÇÃñ‚ëËDžǬǢǃäÆëSÇ»ÉXÉgÅ[ÉäÅ[Çï`Ǣǃå©ÇπÇÈDZÇΔÇÕLJÇΔÇÊÇËïsâ¬î\Ç≈Ç∑ǵÅAMac OS XÇÃì±ì¸ÇΔÇΔLJDžèÛãµÇ™çƒìxïœçXÇ≥ÇÍÇÈDZÇΔLJämé¿Ç≈Ç∑Ç™ÅADZÇÃÉeÉbÉNÉmÅ[ÉgÇ≈ÇÕÅAMac OS Xà»ëOÇÃÇ∑Ç◊ǃÇÃMac OSÇÃÉoÅ[ÉWÉáÉìÇ…ëŒâûǵÇΩÉoÉbÉNÉOÉâÉEÉìÉhàÛç¸ÇëŒè€Ç…ǵǃǢNjÇ∑ÅBDZÇÃíÜÇ…ÇÕÅAÉTÅ[ÉhÉpÅ[ÉeÉBÇÃÉfÉxÉçÉbÉpÇ™ÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÇóòópÇ≈Ç´ÇÈÇÊǧDžÇ∑ÇÈÇΩÇflÇÃèdóvÇ»ïœçXéñçÄLJä‹Ç‹ÇÍǃǢNjÇ∑ÅBÉvÉäÉìÉ^ÉhÉâÉCÉoÇÇ∑Ç≈Ç…äJî≠ǵǃǢÇÈèÍçáÇÕÅADZÇÃÉeÉbÉNÉmÅ[ÉgÇ≈ê‡ñæÇ≥ÇÍǃǢÇÈÅAÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÇÃÉTÉ|Å[ÉgÇí«â¡Ç∑ÇÈÇΩÇflÇ…ïKóvÇ»éñçÄÇéQèΔǵǃÇ≠ÇæÇ≥Ç¢ÅB



èâë„ÇÃÉoÉbÉNÉOÉâÉEÉìÉhàÛç¸ã@î\
èâë„ÇÃÉoÉbÉNÉOÉâÉEÉìÉhàÛç¸ã@î\ÇÕéüÇÃÇÊǧǻLJÇÃÇ≈ǵÇΩÅBÉvÉäÉìÉ^ÉhÉâÉCÉoÇÕÅAëŒè€ÇΔÇ»ÇÈäeÉyÅ[ÉWÇQuickDrawÉsÉNÉ`ÉÉÇΔǵǃÅAÉVÉXÉeÉÄÉtÉHÉãÉ_ì‡ÇÃì¡éÍÇ»ÉtÉHÉãÉ_ÅiÅuSpoolÅvÉtÉHÉãÉ_ÅjÇ…çÏê¨Ç≥ÇÍÇΩÉeÉìÉ|ÉâÉäÉtÉ@ÉCÉãÅiÉXÉvÅ[ÉãÉtÉ@ÉCÉãÅjÇÃÉfÅ[É^ÉtÉHÅ[ÉNÇ…ï€ë∂ǵǃǢNjǵÇΩÅBÇ‹ÇΩÅADZÇÃÉtÉ@ÉCÉãÇÃÉäÉ\Å[ÉXÉtÉHÅ[ÉNÇ…äiî[Ç≥ÇÍÇÈèÓïÒLJdžÇËNjǵÇΩÅBDZÇÃèÓïÒÇÕÅAÉyÅ[ÉWÉtÉHÅ[É}ÉbÉgÅAèëófiñºÅAǪÇÃëºÇÃÉWÉáÉuèÓïÒÅAÇ®ÇÊÇ—äeÉyÅ[ÉWÇÃÉfÅ[É^ÇÃêÊì™Ç÷ÇÃÉIÉtÉZÉbÉgÇãLèqǵǃǢNjǵÇΩÅBÉVÉXÉeÉÄãNìÆéûÇ…MultiFinderÇ…ÇÊǡǃãNìÆÇ≥ÇÍÇÈì¡éÍÇ»ÉAÉvÉäÉPÅ[ÉVÉáÉìÅiBackgrounderÅjÇÕÅAÉvÉäÉìÉ^ÉhÉâÉCÉoÇ…ÇÊǡǃçÏê¨Ç≥ÇÍÇÈèëófiÇäƒéãǵÅAïKóvÇ…âûÇ∂ǃÉvÉäÉìÉgÉÇÉjÉ^ÇãNìÆÇµÇƒÇ¢Ç‹ÇµÇΩÅiBackgrounderÇÕǪÇÃå„ÅASystem 7Ç≈FinderÇ…ìùçáÇ≥ÇÍNjǵÇΩÅjÅBÉvÉäÉìÉgÉÇÉjÉ^ÇÕÉoÉbÉNÉOÉâÉEÉìÉhÇ≈é¿çsÇ≥ÇÍÅAÉXÉvÅ[ÉãÉtÉ@ÉCÉãÇÉvÉäÉìÉ^ÉhÉâÉCÉoÇ…ãüããÇ∑ÇÈã@î\Çâ ÇΩǵǃǢNjǵÇΩÅB

ÉvÉäÉìÉgÉÇÉjÉ^ÇÕÅAí èÌÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇΔÇŸÇ⁄ìØÇ∂ï˚ñ@Ç≈ÉvÉäÉìÉ^ÉhÉâÉCÉoÇåƒÇ—èoÇ∑DZÇΔÇ…ÇÊǡǃÅAǪÇÃà–óÕÇî≠äˆÇµÇ‹Ç∑ÅBÇΩÇæÇµÅAÉhÉâÉCÉoÇÃ'PDEF' 0ÉäÉ\Å[ÉXÇ≈ÇÕÇ»Ç≠ÅA'PDEF' 126ÉäÉ\Å[ÉXÅi'PDEF' 0ÉäÉ\Å[ÉXÇΔìØÇ∂ÉtÉHÅ[É}ÉbÉgÇéùǬÅjÇ™åƒÇ—èoÇ≥ÇÍÇÈì_Ç™àŸÇ»ÇËÇ‹Ç∑ÅBPrOpenÇ™åƒÇ—èoÇ≥ÇÍÇΩíºå„Ç…ÅiPrOpenDocÇ™åƒÇ—èoÇ≥ÇÍÇÈëOÇ…ÅjÅAì¡éÍÇ»PrGeneralÉRÅ[ÉhÇ™ëóêMÇ≥ÇÍÅAǪÇÃå„ÅAåƒÇ—èoÇ∑ïKóvÇÃdžÇÈí ímä÷êîÇ÷ÇÃÉ|ÉCÉìÉ^Ç™ÉvÉäÉìÉ^ÉhÉâÉCÉoÇ…ëóÇÁÇÍÇ‹Ç∑ÅBDZÇÃå„ÅAÉvÉäÉìÉgÉÇÉjÉ^Ç≈ÇÕÅAäiî[Ç≥ÇÍǃǢÇÈÉyÅ[ÉWÉfÅ[É^ÇÉhÉâÉCÉoÇ…ëóêMǵǃÅAäeÉyÅ[ÉWÇàÛç¸ÇµÇ‹Ç∑ÅBDZǧǵÇΩÉoÉbÉNÉOÉâÉEÉìÉhàÛç¸ã@î\ÇÕÅAéüÇÃÇÊǧǻ2ǬÇÃÉPÅ[ÉXÇ≈ÇÕÅAåªç›Ç≈LJÉvÉäÉìÉgÉ}ÉlÅ[ÉWÉÉÇ…ÇÊǡǃégópÇ≥ÇÍǃǢNjÇ∑ÅBǬNjÇËÅAÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^Ç™ÉCÉìÉXÉgÅ[ÉãÇ≥ÇÍǃǢǻǢÇΔÇ´ÅiÇ‹ÇΩÇÕégópí‚é~DžǻǡǃǢÇÈÇΔÇ´ÅjÇΔÅAFinderÇ™é¿çsǵǃǢǻǢÇΔÇ´ÅiFinderÇÃë„ÇÌÇËÇ…At EaseÇ™é¿çsǵǃǢÇÈèÍçáǻǫÅjÇ≈Ç∑ÅB

èâë„ÇÃÉoÉbÉNÉOÉâÉEÉìÉhàÛç¸ã@î\ÇóùâÇ∑ÇÈÇΩÇflÇ…ÇÕÅAǪÇÃÉXÉvÅ[ÉãÉtÉ@ÉCÉãÇÃç\ë¢ÇímÇÈïKóvǙdžÇËÇ‹Ç∑ÅBÉXÉvÅ[ÉãÉtÉ@ÉCÉãÇÃÉäÉ\Å[ÉXÉtÉHÅ[ÉNÇ…ÇÕéüÇÃÉäÉ\Å[ÉXÇ™ä‹Ç‹ÇÍǃǢNjÇ∑ÅiDZÇÃÉeÉbÉNÉmÅ[ÉgÇ≈åæãyÇ∑ÇÈç\ë¢ëÃÇÕÇ∑Ç◊ǃ68KÉAÉâÉCÉìÉÅÉìÉgÇéùÇøÇ‹Ç∑ÅjÅB

Åú 'PREC' 3 - ÉvÉäÉìÉgÉåÉRÅ[Éh
Åú 'alis' -8192 - ÉXÉvÅ[ÉãÉtÉ@ÉCÉãÇçÏê¨ÇµÇΩÉvÉäÉìÉ^ÉhÉâÉCÉoÇÃÉGÉCÉäÉAÉX
Åú 'ics#' 131 - ÉvÉäÉìÉgÉÇÉjÉ^Ç…ï\é¶Ç≥ÇÍÇÈÉXÉvÅ[ÉãÉtÉ@ÉCÉãÇÃÉAÉCÉRÉìÅiè¨Åj
Åú 'PREC' 124 - ÉvÉäÉìÉ^ñº
Åú 'PREC' 126 - ÉWÉáÉuèÓïÒ

typedef {
	short   version;        // èÌÇ…1
	short   flags;          // èÌÇ…0
	short   numPages;       // ÉXÉvÅ[ÉãÉtÉ@ÉCÉãÇÃÉyÅ[ÉWêî
	short   numCopies;      // ÉXÉvÅ[ÉãÉtÉ@ÉCÉãÇÃïîêî
	OSType  creator;        // ÉXÉvÅ[ÉãÉtÉ@ÉCÉãÇçÏê¨ÇµÇΩ
	                        // ÉvÉäÉìÉ^ÉhÉâÉCÉoÇÃÉNÉäÉGÅ[É^É^ÉCÉv
	Str31   appName;        // ÉXÉvÅ[ÉãÉtÉ@ÉCÉãÇçÏê¨ÇµÇΩ
	                        // ÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃñºëO
} PREC126Record, *PREC126Ptr, **PREC126Handle;


Åú 'STR ' -8192 Å| ÉvÉäÉìÉ^ÉhÉâÉCÉoÇÃÉtÉ@ÉCÉãñº
Åú 'STR ' -8189 Å| èëófiñº (ÉuÉâÉìÉNÇñÑÇflçûÇ›ÅAèÌÇ… 80 ÉoÉCÉgÇÃï∂éöóÒDžǵNjÇ∑)

ÉXÉvÅ[ÉãÉtÉ@ÉCÉãÇÃÉfÅ[É^ÉtÉHÅ[ÉNÇÕSpoolFileHeaderç\ë¢ëÃÇ≈énÇ‹ÇËÅAǪÇÃå„Ç…ÉyÅ[ÉWÇ™ë±Ç´Ç‹Ç∑ÅB

typedef struct {
	short   version;	// èÌÇ…1
	long    fileLen;	// ÉwÉbÉ_Çä‹ÇfiÉtÉ@ÉCÉãÇÃÉTÉCÉY
	long    fileFlags;	// èÌÇ…0
	short   numPages;	// ÉXÉvÅ[ÉãÉtÉ@ÉCÉãÇÃÉyÅ[ÉWêî
	TPrint  printRecord;	// PREC 3Çì«Ç›çûÇflǻǢèÍçáÇÃÇ›égóp
} SpoolFileHeader, *SpoolFileHeaderPtr, **SpoolFileHeaderHandle;

typedef struct {
	long    pictFlags;	// èÌÇ…0
	Picture thePict;	// â¬ïœí∑
	long    pageOffset;	// DZÇÃÉyÅ[ÉWÇÃPICTÇÃêÊì™Ç÷ÇÃ
				// ÉIÉtÉZÉbÉg
} SpoolPage;


ÉXÉvÅ[ÉãÉtÉ@ÉCÉãÇÕÅAÉhÉâÉCÉoÇ…ÇÊǡǃÅAÉVÉXÉeÉÄÉtÉHÉãÉ_ì‡ÇÃÅuSpoolÅvÉtÉHÉãÉ_Ç‹ÇΩÇÕÅuÉvÉäÉìÉgÉÇÉjÉ^èëófiÅvÉtÉHÉãÉ_ÇÃíÜÇ…çÏê¨Ç≥ÇÍÇ‹Ç∑ÅBÅiMac OS 8ÇÃÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^Ç™ÉAÉNÉeÉBÉuÇ»èÍçáÇÕÅAåªç›ÇÃè»ó™éûÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÉtÉHÉãÉ_ÇÃíÜÇ…çÏê¨Ç≥ÇÍÇ‹Ç∑ÅBFindFolderkPrintMonitorDocsFolderTypeÉZÉåÉNÉ^ÇégópÇ∑ÇÈÇΔÅAê≥ǵǢÉtÉHÉãÉ_ÇåüèoÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBÅjèëÇ´çûÇ‹ÇÍÇÈÉXÉvÅ[ÉãÉtÉ@ÉCÉãÇÕÅA'?job'ÇΔǢǧÉtÉ@ÉCÉãÉ^ÉCÉvÇΔ'prmt'ÇΔǢǧÉNÉäÉGÅ[É^É^ÉCÉvÇéùÇøÇ‹Ç∑ÅBÉtÉ@ÉCÉãÇÃèëÇ´çûǛǙèIóπÇ∑ÇÈÇΔÅAÉhÉâÉCÉoÇÕÉtÉ@ÉCÉãÉ^ÉCÉvÇ'pjob'Ç…ïœçXǵNjÇ∑ÅBÉTÅ[ÉhÉpÅ[ÉeÉBêªÇÃÉhÉâÉCÉoLJÉTÉ|Å[ÉgÇ≥ÇÍǃǢÇÈèÍçáÇÕÅAÉTÅ[ÉhÉpÅ[ÉeÉBêªÇÃÉhÉâÉCÉoÇÕAppleÉCÉxÉìÉgÇFinderÇ…ëóêMǵǃÅAêVǵǢÉXÉvÅ[ÉãÉtÉ@ÉCÉãÇ™çÏê¨Ç≥ÇÍÇΩDZÇΔÇí ímÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑Åiè⁄ç◊DžǬǢǃÇÕå„èqǵNjÇ∑ÅjÅB

ÉvÉäÉìÉgÉÇÉjÉ^ÅiÇ‹ÇΩÇÕÉfÉXÉNÉgÉbÉvÅEÉvÉäÉìÉgÉÇÉjÉ^ÅjÇ™ÉWÉáÉuÇÉvÉäÉìÉgÇ∑ÇÈÇΔÇ´ÅAÉhÉâÉCÉoÇÃPrOpenÉãÅ[É`ÉìÇ™åƒÇ—èoÇ≥ÇÍÅAÇ≥ÇÁÇ…à»â∫Ç…é¶Ç∑ç\ë¢ëÃÅiÅADesktopPrinting.hÉwÉbÉ_ÉtÉ@ÉCÉãÇéQèΔÅjÇä‹ÇfiPrGeneralÇ™åƒÇ—èoÇ≥ÇÍÇ‹Ç∑ÅBDZÇÃå„ÅAÉvÉäÉìÉgÉÇÉjÉ^Ç≈ÇÕÅAÉhÉâÉCÉoÇ™íËä˙ìIÇ…åƒÇ—èoÇ∑ïKóvÇÃdžÇÈpIdleProcÇä‹ÇfiPrOpenDocÇåƒÇ—èoǵNjÇ∑ÅBPrOpenPageÇΔPrClosePageÇÕèëófiÇÃäeÉyÅ[ÉWÇ≤ÇΔÇ…åƒÇ—èoÇ≥ÇÍÅAǪÇÃåãâ ÅAǪÇÃÉyÅ[ÉWÇ™ÉhÉâÉCÉoÇ…ÉvÉäÉìÉgÇ≥ÇÍÇÈDZÇΔÇ…Ç»ÇËÇ‹Ç∑ÅB

// ä÷êîÇÃÉvÉçÉgÉ^ÉCÉv
typedef pascal void    (*DTPAsyncErrorNotificationProcPtr) (StringHandle string);
typedef pascal void    (*DTPEndNotificationProcPtr) ();
typedef pascal Boolean (*DTPInForegroundProcPtr) ();
typedef pascal void    (*DTPStatusMessageProcPtr) (StringHandle string);

// ÉvÉäÉìÉgÉÇÉjÉ^ãyÇ—ÉfÉXÉNÉgÉbÉvÅEÉvÉäÉìÉgÉÇÉjÉ^Ç™í ímÇÃÇΩÇflÇ…
// égópÇ∑ÇÈPrGeneralÉRÅ[Éh
#define kPrintMonitorPrGeneral -3

// TPrintMonitorPrintingData
// ÉNÉâÉVÉbÉNÉoÉbÉNÉOÉâÉEÉìÉhàÛç¸ÇΔÉTÅ[ÉhÉpÅ[ÉeÉBêªÇÃÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^Ç
// ÉTÉ|Å[ÉgǵǻǢèÍçáÇ…égópÇ≥ÇÍÇÈ
typedef struct {
	short	                     iOpCode;                // kPrintMonitorPrGeneral
	short	                     iError;
	long	                     iReserved;              // 0 = ÉvÉäÉìÉgÉÇÉjÉ^
	THPrint	                     hPrint;
	short	                     noProcs;                // í ímä÷êîÇÃêî
	long	                     iReserved2;
	DTPAsyncErrorNotificationUPP pAsyncNotificationProc; // í ímÇäJénÇ≥ÇπÇÈUPP
	DTPEndNotificationUPP        pAsyncEndnotifyProc;    // í ímÇèIóπÇ≥ÇπÇÈUPP
	DTPInForegroundUPP           pDTPInForegroundProc;   // ÉvÉäÉìÉgÉÇÉjÉ^Ç™
	                                                     // ëSñ Ç…džÇÈǩǫǧǩÇÃämîF
} TPrintMonitorPrintingData;

// TDesktopPrintMonitorPrintingData
// ÉTÅ[ÉhÉpÅ[ÉeÉBêªÇÃÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÇÉTÉ|Å[ÉgǵǃǢÇÈèÍçáÇ…égópÇ≥ÇÍÇÈ
typedef struct {
	short	                     iOpCode;                // kPrintMonitorPrGeneral
	short	                     iError;
	long	                     iReserved;              // 1 = ÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉgÉÇÉjÉ^
	THPrint	                     hPrint;
	short	                     noProcs;                // í ímä÷êîÇÃêî
	long	                     iReserved2;
	DTPAsyncErrorNotificationUPP pAsyncNotificationProc; // í ímÇäJénÇ≥ÇπÇÈUPP
	DTPEndNotificationUPP        pAsyncEndnotifyProc;    // í ímÇèIóπÇ≥ÇπÇÈUPP
	DTPInForegroundUPP           pInForegroundProc;      // ÉvÉäÉìÉgÉÇÉjÉ^Ç™
	                                                     // ëSñ Ç…džÇÈǩǫǧǩÇÃämîF
	DTPStatusMessageUPP          pStatusMessageProc;     // ÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^
	                                                     // ÉEÉCÉìÉhÉEÇÃèÛãµÇçXêVÇ∑ÇÈ
} TDesktopPrintMonitorPrintingData;


ÉoÉbÉNÉOÉâÉEÉìÉhàÛç¸ã@î\ÇégǡǃàÛç¸Ç∑ÇÈèÍçáÅAÉvÉäÉìÉgÉÇÉjÉ^ÇΔÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉgÉÇÉjÉ^ÇÕÅAPrOpenDocÇåƒÇ—èoÇ∑íºëOÇ…DialogPtrÇÉçÅ[ÉÅÉÇÉäÇÃÉOÉçÅ[ÉoÉãïœêîÅiApplScratchÅjÇ…äiî[ǵNjÇ∑ÅBÉhÉâÉCÉoÇ≈ÇÕÅAGetDialogItemÇΔSetDialogItemTextÇégǡǃÅAǪÇÃÉ_ÉCÉAÉçÉOÇÃêÊì™çÄñ⁄Ç…íÜÇ…èÛãµÉÅÉbÉZÅ[ÉWÇäiî[Ç∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅB

PrGeneralåƒÇ—èoǵDžÇÊÇËÅAàÛç¸Ç™ÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉgÉÇÉjÉ^ÅiÉCÉìÉ^ÉtÉFÅ[ÉXÇéùÇΩǻǢÉoÉbÉNÉOÉâÉEÉìÉhÉAÉvÉäÉPÅ[ÉVÉáÉìÅjÇ©ÇÁé¿çsÇ≥ÇÍǃǢÇÈDZÇΔÇ™ñæÇÁǩǻèÍçáÇÕÅAÉ_ÉCÉAÉçÉOÇ‹ÇΩÇÕÉAÉâÅ[ÉgÇï\é¶ÇµÇƒÇÕÇ¢ÇØÇ‹ÇπÇÒÅBÇΩÇæÇµó·äOÇÕÅAÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉgÉÇÉjÉ^Ç™StopAlertÇΔParamTextÇ…ÉpÉbÉ`ÇìñǃǃǢÇÈDZÇΔÇ≈Ç∑ÅBParamTextÇåƒÇ—èoǵÅAÇ≥ÇÁÇ…StopAlertÇåƒÇ—èoÇ∑ÇΔÅAFinderÇÕê›íËÇ≥ÇÍÇΩÉeÉLÉXÉgÇä‹ÇfiÉAÉâÅ[ÉgÇï\é¶ÇµÇ‹Ç∑ÅBÇΩÇæÇµÅAStopAlertÇ…ìnÇ≥ÇÍÇΩÉtÉBÉãÉ^ä÷êîÇÕåƒÇ—èoÇ≥ÇÍÇ‹ÇπÇÒÅB

ÉvÉäÉìÉ^ÉhÉâÉCÉoÇÕÉÜÅ[ÉUÇ…ÇÊÇÈÉWÉáÉuÇÃàÍéûí‚é~ÅAàÛç¸ÉLÉÖÅ[ÇÃí‚é~ÅALJǧàÍìxàÛç¸ÇÇ∑ÇÈÅAÉWÉáÉuÇÃÉLÉÉÉìÉZÉãÇÃÉIÉvÉVÉáÉìÇíÒãüÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBÉÜÅ[ÉUÇ™ÉAÉâÅ[ÉgÇ≈ÉIÉvÉVÉáÉìÇëIÇÒÇæå„ÅAÉvÉäÉìÉ^ÉhÉâÉCÉoÇÕÉvÉäÉìÉgÉ}ÉlÅ[ÉWÉÉÇÃÉGÉâÅ[ÉRÅ[ÉhÅiSetPrErrorÅjÇà»â∫ÇÃÇ¢Ç∏ÇÍÇ©ÇÃílÇ…ê›íËǵNjÇ∑ÅB

// ÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÇÃÉGÉâÅ[ÉRÅ[Éh

#define    kDTPHoldJobErr        -4200
#define    kDTPStopQueueErr      -4201
#define    kDTPTryAgainErr       -4202
#define    kDTPAbortJobErr       128
ÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÉÇÉjÉ^ÇÕéwíËÇ≥ÇÍÇΩílÇ…âûÇ∂ǃÅAÉWÉáÉuÇÃàÍéûí‚é~ÅAàÛç¸ÉLÉÖÅ[ÇÃí‚é~ÅALJǧàÍìxàÛç¸ÇÇ∑ÇÈÅAÉWÉáÉuÇÃÉLÉÉÉìÉZÉãÇé¿çsǵNjÇ∑ÅB

ÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÇÃåªç›
ÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÇÕÅALaserWriter 8.3Ç®ÇÊÇ—StyleWriter 1200ÉvÉäÉìÉ^ÉhÉâÉCÉoÇΔÇΔLJDžì±ì¸Ç≥ÇÍNjǵÇΩÅBÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÇÕÅAèâë„ÇÃÉoÉbÉNÉOÉâÉEÉìÉhàÛç¸ã@î\ÇΔÇŸÇ⁄ìØÇ∂ãZèpÇçÃópǵǃǢNjÇ∑ÅBåªç›ÅAAppleèÉê≥ÉvÉäÉìÉ^ÉhÉâÉCÉoÇÃÇ›ÇÉTÉ|Å[ÉgǵǃǢNjÇ∑Ç™ÅAMac OS 8.5Ç≈ÇÕÉTÅ[ÉhÉpÅ[ÉeÉBêªÇÃÉvÉäÉìÉ^Ç≈LJÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÇΔǵǃégǶNjÇ∑ÅBÉhÉâÉCÉoÇ…ëgÇ›çûÇfiïKóvÇÃdžÇÈí«â¡çÄñ⁄ÇDZDZÇ≈è–âÓǵNjÇ∑ÅB

ÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÇÉTÉ|Å[ÉgÇ∑ÇÈÇΩÇflÇ…í«â¡Ç∑ÇÈïKóvÇÃdžÇÈÉäÉ\Å[ÉXÇÕÅAéÂÇ…ÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÇÃÉAÉCÉRÉìÇ≈Ç∑ÅBÉvÉäÉìÉ^ÉhÉâÉCÉoÇäJî≠ǵǃǢÇÈÉfÉxÉçÉbÉpÇÕÅAÉhÉâÉCÉoÇÃÉNÉäÉGÅ[É^É^ÉCÉvÇΔÇΔLJDžäÆëSÇ»'BNDL'ÉäÉ\Å[ÉXÇãüããÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBÇ∑Ç≈Ç…ÉhÉâÉCÉoì‡ïîÇ‚èâä˙ê›íËÉtÉ@ÉCÉãǻǫÇ≈égópÇ∑ÇÈÇΩÇflÇÃÉtÉ@ÉCÉãÉ^ÉCÉvÇΔÉAÉCÉRÉìÇΔÇÕï Ç…ÅA'dpnn'ÅA'dpcn'ÅA'dpna'ÇÃÉtÉ@ÉCÉãÉ^ÉCÉvÇ…ëŒÇ∑ÇÈÉAÉCÉRÉìÇí«â¡Ç∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBDZÇÍÇÁÇÕÅA"í èÌ" ÇÃÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÅAè»ó™éûÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^Åió÷äsÇ™ëæê¸Ç≈àÕÇ‹ÇÍǃǢÇÈÅjÅAÇ®ÇÊÇ—ÉAÉNÉeÉBÉuÇ≈ǻǢÅiÇ‹ÇΩÇÕégópâ¬î\Ç≈ǻǢÅjÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^DžǪÇÍǺÇÍëŒâûǵǃǢNjÇ∑ÅBDZÇÃó·ÇΔǵǃÅAéüÇ…Color StyleWriter 2500ÇÃÉoÉìÉhÉãÇé¶ÇµÇ‹Ç∑ÅBèÆÅALaserWriter 8ÇÃèÍçáÇÕÅAÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÇÃÉAÉCÉRÉìÇê›íËÇ∑ÇÈï˚ñ@ÇÕé·ä±àŸÇ»ÇƒÇ®ÇËÅAÉAÉCÉRÉìÇÕëŒè€ÇΔÇ»ÇÈÉvÉäÉìÉ^Ç…ëŒâûÇ∑ÇÈPPDÅiPostScript printer descriptionÅjÉtÉ@ÉCÉãÇ©ÇÁéÊìæÇ≥ÇÍÇ‹Ç∑ÅB

BNDL ID -8193
StyleWriter 2500ÇÃÉoÉìÉhÉãÇΔÉAÉCÉRÉì


AppleèÉê≥ÇÃÉvÉäÉìÉ^ÉhÉâÉCÉoÇ™ÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÇΔǵǃégópÇ≥ÇÍÅAÉXÉvÅ[ÉãÉtÉ@ÉCÉãÇçÏê¨Ç∑ÇÈÇΔÇ´ÅAǪÇÃÉtÉ@ÉCÉãÇÕÅAèâë„ÇÃÉoÉbÉNÉOÉâÉEÉìÉhàÛç¸ã@î\Ç≈égópÇ≥ÇÍÇΩÇÃÇΔìØÇ∂ÉtÉHÉãÉ_Ç…äiî[Ç≥ÇÍÇ‹Ç∑ÅBÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ã@î\ägí£Ç™ÉtÉ@ÉCÉãÇÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^Ç…à⁄ìÆÇµÅAé¿ç€Ç…èëófiÇÃÉvÉäÉìÉgÉvÉçÉZÉXÇäJénǵNjÇ∑ÅBÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^Ç™ÉAÉNÉeÉBÉuÇ»ÇΔÇ´ÇÕÅAéüÇ…íËã`Ç∑ÇÈÉäÉ\Å[ÉXÇ™ÉXÉvÅ[ÉãÉtÉ@ÉCÉãÇ…í«â¡Ç≥ÇÍÇ‹Ç∑ÅB

Åú 'PINX' -8200 Å| ÉyÅ[ÉWÉCÉìÉfÉbÉNÉXÉäÉ\Å[ÉX
Åú 'jobi' 1 Å| ÉvÉäÉìÉgÉWÉáÉuèÓïÒ

// PINX -8200ÅiÉyÅ[ÉWÉCÉìÉfÉbÉNÉXÉäÉ\Å[ÉXÅj

typedef struct {
	short count;            // pageOffsetÇÃçÄñ⁄êî
	long  pageoffset [1];	// ÉtÉ@ÉCÉãÇÃêÊì™Ç©ÇÁÉyÅ[ÉWÉåÉRÅ[ÉhÇ÷ÇÃ
				// ÉIÉtÉZÉbÉg (ǬNjÇËÅAêÊì™ÉyÅ[ÉWÇÃèÍçáÇÕÅA
				// sizeof (SpoolFileHeader) Ç…Ç»ÇÈ) 
} SpoolPageIndex, *SpoolPageIndexPtr, **SpoolPageIndexHandle;

// jobi 1ÅiÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÉWÉáÉuèÓïÒÉäÉ\Å[ÉXÅj
// ÉvÉäÉìÉgóDêÊèáà 

#define kDTPPrintJobUrgent     0x00000001
#define kDTPPrintJobAtTime     0x00000002
#define kDTPPrintJobNormal     0x00000003
#define kDTPPrintJobHolding    0x00001003

typedef struct {
	short          firstPageToPrint;   // àÛç¸Ç∑ÇÈÉXÉvÅ[ÉãÉtÉ@ÉCÉãÇÃêÊì™ÉyÅ[ÉW
	short          priority;           // àÛç¸óDêÊèáà Åió·ÅFkDTPPrintJobNormalÅj
	short          numCopies;          // àÛç¸ïîêî
	short          numPages;           // ÉXÉvÅ[ÉãÉtÉ@ÉCÉãÇÃÉyÅ[ÉWêî
	unsigned long  timeToPrint;        // óDêÊèáà Ç™kPrintJobAtTimeÇÃÇΔÇ´ÅAàÛç¸Ç∑ÇÈ
                                           // éûçèÅiïbÅj
	Str31          documentName;       // èëófiñº
	Str31          applicationName;    // ÉXÉvÅ[ÉãÉtÉ@ÉCÉãÇçÏê¨ÇµÇΩÉAÉvÉäÉPÅ[ÉVÉáÉìñº
	Str32          printerName;        // ÉvÉäÉìÉ^ñº
                                           // ÅiPREC 124ÇΔàÍívÇµÇƒÇ¢Ç»ÇØÇÍnjǻÇÁǻǢÅj
} DTPPrintJobInfo, *DTPPrintJobInfoPtr, **DTPPrintJobInfoHandle;
ï ÇÃí«â¡ÇçsǧDZÇΔÇ≈ÅAè»ó™éûÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÇïœçXÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBÉAÉvÉäÉPÅ[ÉVÉáÉìÇ‹ÇΩÇÕÉhÉâÉCÉoÇÕAppleÉCÉxÉìÉgÇFinderÇ…ëóêMÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅB ÅiSendAEToFinderÇÕFinderÇ…ÉCÉxÉìÉgÇëóêMǵNjÇ∑ÅBè⁄ç◊DžǬǢǃÇÕDTPSample.cÇÇ≤óóâ∫Ç≥Ç¢ÅBÅj
#define kDTPSignature             'dtpx'
#define aeDTPSetDefaultEventType  'pfsd'

typedef struct {
	OSType   dtpSignature;      // kDTPSignature
	OSType   dtpEventType;      // aeDTPSetDefaultEventTypeç≥ÇÕaeDTPSyncEventType
	FSSpec   dtpSpec;           // ÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÇÃFSSpec
} DTPAppleEventData;

OSErr SetDefaultDTP (StringPtr dtpName)
{
	OSErr              err;
	DTPAppleEventData  myEvent;

	myEvent.dtpSignature = kDTPSignature;
	myEvent.dtpEventType = aeDTPSetDefaultEventType;
    BlockMove ((Ptr) dtpSpec, (Ptr) &myEvent.dtpSpec, sizeof (FSSpec));

	err = SendAEToFinder ((Ptr) &myEvent, sizeof (DTPAppleEventData));

	return err;
}
ÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÇÃñæì˙
Mac OS 8ÇÃìoèÍÇΔÇΔLJDžÅAÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÇÕìΔóßǵÇΩã@î\ägí£Ç≈ÇÕÇ»Ç≠Ç»ÇËNjǵÇΩÅBÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ã@î\ÇÕFinderÇ…ìùçáÇ≥ÇÍÅAǪÇÃåãâ ÇΔǵǃÅAÇŸÇΔÇÒÇ«ÇÃèÍçáÇ…ÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÇégópÇ≈Ç´ÇÈÇÊǧDžǻÇËÇ‹Ç∑ÅBÇ‡ÇøÇÎÇÒÅAã@î\ägí£É}ÉlÅ[ÉWÉÉÇ≈ÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉgÉÇÉjÉ^ÇΔÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^•ÉXÉvÅ[ÉâÇégópí‚é~Ç…Ç∑ÇÍÇŒÅAÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ã@î\ÇÉIÉtÇ…Ç∑ÇÈDZÇΔLJÇ≈Ç´Ç‹Ç∑ÅBMac OS 8.5Ç≈ÇÕÉTÅ[ÉhÉpÅ[ÉeÉBêªÇÃÉhÉâÉCÉoLJÉTÉ|Å[ÉgÇ≥ÇÍǃǢNjÇ∑ÅB

ÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÇÕGestaltÉZÉåÉNÉ^ÇÉCÉìÉXÉgÅ[ÉãǵÅAÉTÅ[ÉhÉpÅ[ÉeÉBêªÇÃÉvÉäÉìÉ^ÉhÉâÉCÉoÇ™ÉTÉ|Å[ÉgÇ≥ÇÍǃǢÇÈǩǫǧǩÇímÇÁÇπÇ‹Ç∑ÅBÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^Ç™égópâ¬î\Ç≈džǡǃLJÅAÉTÅ[ÉhÉpÅ[ÉeÉBêªÇÃÉvÉäÉìÉ^ÉhÉâÉCÉoÇ™ÉTÉ|Å[ÉgÇ≥ÇÍǃǢǻǢDZÇΔǙDZÇÃÉZÉåÉNÉ^Ç≈é¶Ç≥ÇÍǃǢÇÈèÍçáÇÕÅAëOèqÇÃÅuèâë„ÇÃÉoÉbÉNÉOÉâÉEÉìÉhàÛç¸ã@î\ÅvÇ≈ê‡ñæÇµÇΩï˚ñ@ÇégópÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅB
#define kGestaltPFEFeatures  'dtpf'
#define kThirdPartySupport   0x00000004
Boolean ThirdPartyDriverSupported(void)

{
	long  response;
	Boolean result = false;
	OSErr err = Gestalt(kGestaltPFEFeatures,&response);
	if (err == noErr)
	result = !!(response & kThirdPartySupport);
	return result;
}


ÉTÅ[ÉhÉpÅ[ÉeÉBêªÇÃÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^Ç™ÉTÉ|Å[ÉgÇ≥ÇÍǃǢÇÈÇΔÇ´ÅAÉTÅ[ÉhÉpÅ[ÉeÉBêªÇÃÉhÉâÉCÉoÇÕÅA'?job'ÇΔǢǧÉtÉ@ÉCÉãÉ^ÉCÉvÇégǡǃÅAÉXÉvÅ[ÉãÉtÉ@ÉCÉãÇíºê⁄ÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÇÃÉtÉHÉãÉ_Ç…èëÇ´çûÇfiïKóvǙdžÇËÇ‹Ç∑ÅBÉXÉvÅ[ÉãçÏãΔÇ™äÆóπǵÇΩÇÁÅAÉtÉ@ÉCÉãÉ^ÉCÉvÇ'pjob'Ç…ïœçXǵNjÇ∑ÅBÉhÉâÉCÉoÇ≈ÇÕÅAÉfÉXÉNÉgÉbÉvÅEÉvÉäÉìÉ^ã@î\ägí£ÉZÉåÉNÉ^Çä‹ÇfiGestaltÉãÅ[É`ÉìÇåƒÇ—èoǵǃÅAåªç›ëIëÇ≥ÇÍǃǢÇÈè»ó™éûÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÇÃÉtÉHÉãÉ_Ç‚ÅAǪÇÃëºÇÃëΩÇ≠ÇÃçÄñ⁄ÇåàíËÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBDZÇÃÉZÉåÉNÉ^ÇÕ'dtpx'Ç≈džÇËÅAǪÇÃèÓïÒÇÕÉnÉìÉhÉãÇΔǵǃï‘Ç≥ÇÍÇ‹Ç∑ÅBtheDTPListÇΔGestaltDTPInfoHandleÇ…ëŒÇµÇƒÇÕDisposeHandleÇê‚ëŒåƒÇ—èoÇ≥ǻǢÇ≈Ç≠ÇæÇ≥Ç¢ÅB

// ÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^èÓïÒGestaltÉZÉåÉNÉ^
// DZÇÃGestaltÉZÉåÉNÉ^ÇégǡǃÇ∑Ç◊ǃÇÃÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÇÃèÓïÒÇ™ìæÇÁÇÍÇ‹Ç∑

enum { gestaltDTPInfo = 'dtpx' );
enum
{
    kDTPGestaltStructVersion2 = 0x02008000,  // ÉoÅ[ÉWÉáÉì2.0f0ÅiMac OS 8.0ÅA8.1ÅA7.xÅj
    kDTPGestaltStructVersion3 = 0x03000000,  // ÉoÅ[ÉWÉáÉì3.0ÅiMac OS 8.5Åj
};

// ÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^èÓïÒ
typedef struct {
	short   vRefNum;	// ÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÉtÉHÉãÉ_ÇÃvRefNum
	long    dirID;		// ÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÉtÉHÉãÉ_ÇÃÉfÉBÉåÉNÉgÉäID
	Str31   dtpName;	// ÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÉtÉHÉãÉ_ÇÃñºëO
	OSType  driverType;	// ÉhÉâÉCÉoÇÃÉNÉäÉGÅ[É^
	Boolean current;	// è»ó™éûÉvÉäÉìÉ^Ç…éwíËÇ≥ÇÍǃǢÇÈǩǫǧǩ
	Str32   printerName;	// ÉvÉäÉìÉ^ÇÃÉlÉbÉgÉèÅ[ÉNñº
				// (LaserWriter 8.4ÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÇÃèÍçáÇÃÇ›)
	Str32   zoneName;	// ÉvÉäÉìÉ^ÇÃÉ]Å[Éì
				// (LaserWriter 8.4ÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÇÃèÍçáÇÃÇ›)
} DTPInfo;

// ÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^GestaltÉZÉåÉNÉ^ÇÃèÓïÒ
typedef struct
{
    long    version;            // kDTPGestaltStructVersion2ç≥ÇÕ
                                // kDTPGestaltStructVersion3
    short   numDTPs;            // ÉäÉXÉgÇ…ä‹Ç‹ÇÍÇÈÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ÇÃêî
    Handle  theDTPList;         // ÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÇÃDTPInfoÉäÉXÉgÇ÷ÇÃÉnÉìÉhÉã
    Handle  theDTPDriverList;   // ÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÇÃÉtÉ@ÉCÉãèÓïÒÉäÉXÉgÇ÷ÇÃÉnÉìÉhÉã
    long    reserved;
} GestaltDTPInfo, **GestaltDTPInfoHandle;
ÉXÉvÅ[ÉãÉtÉ@ÉCÉãÇÃèëÇ´çûǛǙèIóπǵÇΩÇÁÅAFinderÇ…AppleÉCÉxÉìÉgÇëóêMǵǃí ímÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBè⁄ǵÇ≠ÇÕDTPSample.cÇÃSyncDTPä÷êîÇÇ≤óóâ∫Ç≥Ç¢ÅB

DZÇÃÉoÅ[ÉWÉáÉìÇÃÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ã@î\Ç…ÇÕÅAÇ≥ÇÁÇ…ï ÇÃåƒÇ—èoǵLJí«â¡Ç≥ÇÍÇ‹Ç∑ÅBãÔëÃìIÇ…ÇÕÉhÉâÉCÉoÇ™ÉTÉ|Å[ÉgÇ∑ÇÈïKóvÇÃdžÇÈ3ǬÇÃêVǵǢPrGeneralÉZÉåÉNÉ^ÅikIsSamePrinterInfoÅAkGetPrinterInfoÅAÇ®ÇÊÇ—kSetDefaultPrinterInfoÅjÇ™ópà”Ç≥ÇÍǃǢNjÇ∑ÅBDZÇÍÇÁÇÃÉZÉåÉNÉ^ÇÕÅAÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ã@î\ägí£Ç™ÉhÉâÉCÉoÇÃÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÇÃíÜÇÃÇ«ÇÍÇ™åªç›ÇÃè»ó™éûÉvÉäÉìÉ^Ç≈džÇÈÇ©ÇîªíËǵÇΩÇËÅAêVãKÇ…ÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÇçÏê¨Ç∑ÇÈïKóvǙdžÇÈǩǫǧǩÇîªífǵÇΩÇËÅAÇ≥ÇÁÇ…ÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^Ç™è»ó™éûÇ≈ëIëÇ≥ÇÍǃǢÇÈDZÇΔÇÉhÉâÉCÉoÇ…í ímÇ∑ÇÈDZÇΔÇâ¬î\DžǵNjÇ∑ÅBà»â∫Ç…ÅADZÇÍÇÁÇÃÉZÉåÉNÉ^ÇégópÇ∑ÇÈç€Ç…ïKóvÇ»ç\ë¢ëÃÇé¶ÇµÇ‹Ç∑ÅB
// PrGeneral opÉRÅ[Éh
enum
{
    kDTPGetPrinterInfo        = 23,
    kDTPIsSamePrinterInfo     = 24,
    kDTPSetDefaultPrinterInfo = 25
};

// ÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÇÃéÌï ÅiÉAÉhÉåÉXÉ^ÉCÉvÅj
enum
{
    kDTPUnknownPrinterType      = -1,   // éÌï ïsñæ
    kDTPSerialPrinterType       = 0,    // ÉVÉäÉAÉãÉvÉäÉìÉ^
    kDTPAppleTalkPrinterType    = 1,    // AppleTalkÉvÉäÉìÉ^
    kDTPTCPIPPrinterType        = 2,    // TCP/IPÉvÉäÉìÉ^
    kDTPSCSIPrinterType         = 3,    // SCSIÉvÉäÉìÉ^
    kDTPUSBPrinterType          = 4     // USBÉvÉäÉìÉ^
};

// ÉVÉäÉAÉãÉ|Å[Ég
enum
{
    kDTPUnknownPort = -1,     // Communications ToolboxǻǫÇ≈ÅAÉvÉäÉìÉ^É|Å[ÉgÇ‚
                              // ÉÇÉfÉÄÉ|Å[Égà»äOÇÃÉVÉäÉAÉãÉ|Å[ÉgDžLJëŒâûǵǃǢÇÈèÍçá
    kDTPPrinterPort = 0,      // ÉvÉäÉìÉ^É|Å[Ég
    kDTPModemPort   = 1       // ÉÇÉfÉÄÉ|Å[Ég
};

// ÉVÉäÉAÉãÉvÉäÉìÉ^ÇÃÉAÉhÉåÉX
typedef struct
{
    short   port;             // kDTPPrinterPortÅAkDTPModemPortÅAkDTPUnknownPortÇÃÇ¢Ç∏ÇÍÇ©
    Str31   portName;         // portÇ≈éwíËÇ≥ÇÍÇΩÉVÉäÉAÉãÉ|Å[ÉgÇÃñºèÃ
} DTPSerialAddress;

// AppleTalkÉvÉäÉìÉ^ÇÃÉAÉhÉåÉX
typedef struct
{
    Str32   nbpName;
    Str32   nbpZone;
    Str32   nbpType;
} DTPAppleTalkAddress;

// TCP/IPÉvÉäÉìÉ^ÇÃÉAÉhÉåÉX
typedef struct
{
    Str255  TCPIPAddress;
    Str255  queueName;
} DTPTCPIPAddress;

// SCSIÉvÉäÉìÉ^ÇÃÉAÉhÉåÉX
typedef struct
{
    short   id;                 // SCSIî‘çÜ
} DTPSCSIAddress;

// USBÉvÉäÉìÉ^ÇÃÉAÉhÉåÉX
typedef struct
{
    Str255  name;               // ÉvÉäÉìÉ^ñº
} DTPUSBAddress;

// PrGeneralÇ…ìnÇ∑èÓïÒ
typedef struct
{
    Str31   dtpDefaultName;     // ÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^Ç…égópÇ≥ÇÍÇÈè»ó™éûÇÃñºëO
    short   printerType;        // kDTPSerialPrinterTypeÅAkDTPAppleTalkPrinterTypeÅA
                                // kDTPTCPIPPrinterTypeÅAkDTPSCSIPrinterTypeÅA
                                // kDTPUSBPrinterTypeÅAkDTPUnknownPrinterTypeÇÃÇ¢Ç∏ÇÍÇ©

    // ÉvÉäÉìÉ^éÌï å≈óLÇÃèÓïÒ
    union
    {
        DTPSerialAddress        serial;
        DTPAppleTalkAddress     appleTalk;
        DTPTCPIPAddress         tcpip;
        DTPSCSIAddress          scsi;
        DTPUSBAddress           usb;
    } u;

    // ÉhÉâÉCÉoå≈óLÇÃèÓïÒÇÕîCà”Ç…í«â¡Ç≈Ç´ÇÈ

} DTPPrinterInfo, **DTPPrinterInfoHandle;

typedef struct
{
    short                 iOpCode;      // kDTPGetPrinterInfoÅAkDTPIsSamePrinterInfoÅA
                                        // kDTPSetDefaultPrinterInfoÇÃÇ¢Ç∏ÇÍÇ©
    short                 iError;
    long                  iCommand;
    DTPPrinterInfoHandle  printerInfo;
} TDTPPrGeneralData;
ÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ã@î\Ç…ëŒâûǵǃǢÇÈDZÇΔÇFinderÇ…ímÇÁÇπÇÈÇΩÇflÇ…ÇÕÅAÉvÉäÉìÉ^ÉhÉâÉCÉoÇÃÉäÉ\Å[ÉXÉtÉHÅ[ÉNÇ…'dtpi'ÉäÉ\Å[ÉXÇí«â¡Ç∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅB'dtpi'ÉäÉ\Å[ÉXÇÕà»â∫ÇÃÇÊǧDžíËã`Ç≥ÇÍǃǢNjÇ∑ÅB
// ÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÇÃèÓïÒÉäÉ\Å[ÉX
#define kDTPInfoResType 'dtpi'
#define kDTPInfoResID   -8192

// ÉTÉ|Å[ÉgÇ≥ÇÍǃǢÇÈê⁄ë±ï˚ñ@
#define kDTPUnknownConnection       0x00000000  // ê⁄ë±ï˚ñ@ïsñæ
#define kDTPSerialConnection        0x00000001  // ÉVÉäÉAÉãê⁄ë±
#define kDTPSCSIConnection          0x00000002  // SCSIê⁄ë±
#define kDTPAppleTalkConnection     0x00000004  // AppleTalkê⁄ë±
#define kDTPTCPIPConnection         0x00000008  // TCP/IPê⁄ë±
#define kDTPUSBConnection           0x00000010  // USBê⁄ë±

// ÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^Ç™ÉTÉ|Å[ÉgÇ∑ÇÈí«â¡ã@î\
#define kDTPBasicFeatures           0x00000000	// ÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÇÃäÓñ{ã@î\ÇÃÇ›ÇÉTÉ|Å[Ég

typedef struct
{
    long    features;          // kDTPBasicFeaturesÅiMacOS 8.5ÇÕäÓñ{ã@î\ÇÃÇ›ÇÉTÉ|Å[ÉgǵNjÇ∑Åj
    long    connectionType;    // kDTPUnknownConnectionç≥ÇÕ
                               // kDTPSerialConnectionÅAkDTPSCSIConnectionÅA
                               // kDTPAppleTalkConnectionÅAkDTPTCPIPConnectionÅA
                               // kDTPUSBConnectionÇÃåãçá
} DTPInfoResource;
ÉZÉåÉNÉ^Ç≈ÉTÅ[ÉhÉpÅ[ÉeÉBêªÇÃÉvÉäÉìÉ^ÉhÉâÉCÉoÇ™ëIëÇ≥ÇÍÇÈÇΔÇ´ÅAÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ã@î\ÇÕàÍòAÇÃPrGeneralÉRÅ[ÉhÇ…ÇÊǡǃǪÇÃÉhÉâÉCÉoÇåƒÇ—èoǵNjÇ∑ÅBÇ‹Ç∏ç≈èâÇ…ÅAǪÇÃÉvÉäÉìÉ^ÉhÉâÉCÉoÇ…ÇÊǡǃçÏê¨Ç≥ÇÍÇΩǪÇÍǺÇÍÇÃÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^DžǬǢǃÅAkIsSamePrinterInfoÉZÉåÉNÉ^Çä‹ÇfiåƒÇ—èoǵǙé¿çsÇ≥ÇÍÅAåªç›ëIëÇ≥ÇÍǃǢÇÈÉvÉäÉìÉ^Ç™åàíËÇ≥ÇÍÇ‹Ç∑ÅBDZÇÍÇ…ëŒÇµÇƒÅAÉhÉâÉCÉoÇÕÅATPrinterInfoPrGeneralDataÉåÉRÅ[ÉhÇÃiErrorÉtÉBÅ[ÉãÉhÇ…èÓïÒÇèëÇ´çûÇÒÇ≈âûìöǵNjÇ∑ÅBÉhÉâÉCÉoÇ™åªç›ÇÃÉvÉäÉìÉ^Ç≈džÇÈÇΔîªífǵÇΩÉvÉäÉìÉ^Ç™kIsSamePrinterInfoÉZÉåÉNÉ^Ç≈ìnÇ≥ÇÍÇΩèÓïÒÇΔàÍívÇ∑ÇÈèÍçáÅAÉhÉâÉCÉoÇÕiErrorÉtÉBÅ[ÉãÉhÇ…noErrÇê›íËǵNjÇ∑ÅBÇ‹ÇΩÅAàÍívǵǻǢèÍçáÇÕÅAiErrorÉtÉBÅ[ÉãÉhÇ…-1Çê›íËǵNjÇ∑ÅB

ÉZÉåÉNÉ^Ç≈ëIëÇ≥ÇÍÇΩÉvÉäÉìÉ^Ç™ÅAÉhÉâÉCÉoÇ…ÇÊǡǃèäóLÇ≥ÇÍǃǢÇÈÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^Ç…ä‹Ç‹ÇÍǃǢǻǢèÍçáÇÕÅAêVǵǢÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ÇçÏê¨ÇµÅAkGetPrinterInfoÉZÉåÉNÉ^Çä‹ÇfiPrGeneralÇåƒÇ—èoǵǃÅAëIëÇ≥ÇÍǃǢÇÈÉvÉäÉìÉ^Ç…ëŒâûÇ∑ÇÈèÓïÒÇéÊìæÇµÇ‹Ç∑ÅBDZÇÃéûì_Ç≈ÅAÉhÉâÉCÉoÇ≈ÇÕprinterInfoÉnÉìÉhÉãÇÃÉTÉCÉYÇïœçXǵǃÉvÉäÉìÉ^èÓïÒÇèëÇ´çûǛNjÇ∑ÅBçÏê¨ÇµÇΩÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^Ç…égópǵÇΩÇ¢ñºëOÇdtpDefaultNameÉtÉBÅ[ÉãÉhÇ…èëÇ´çûÇfiïKóvǙdžÇËÇ‹Ç∑ÅBÇ‹ÇΩÅAÉhÉâÉCÉoÇ≈ÇÕÅAïKóvÇ…âûÇ∂ǃîCà”ÇÃÉvÉäÉìÉ^èÓïÒÇí«â¡Ç∑ÇÈDZÇΔLJÇ≈Ç´Ç‹Ç∑ÅBǪÇÃèÓïÒÇï‘Ç∑ÇΔÅAÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ã@î\ägí£ÇÕDZÇÃèÓïÒÇÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÇÃì‡ïîÇ…ï€ë∂ǵNjÇ∑ÅB

ÉÜÅ[ÉUÇ™ÅuÉvÉäÉìÉ^ÅvÉÅÉjÉÖÅ[ÅiÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ÇÉNÉäÉbÉNÇ∑ÇÈÇΔFinderÇ…ï\é¶Ç≥ÇÍÇÈÅjÇÃÅuè»ó™éûÉvÉäÉìÉ^Ç…éwíËÅvÉRÉ}ÉìÉhÇégǡǃÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÇÃÇ¢Ç∏ÇÍÇ©ÇëIëÇ∑ÇÈÇΔÇ´ÅAÉhÉâÉCÉoÇÕkSetDefaultPrinterInfoÉZÉåÉNÉ^Çä‹ÇfiPrGeneralåƒÇ—èoǵÇé¿çsǵNjÇ∑ÅBDZÇÃåƒÇ—èoǵÇéÛÇØéÊÇ¡ÇΩÇΔÇ´ÇÕÅAÉhÉâÉCÉoÇ™ï€éùǵǃǢÇÈì‡ïîê›íËÇïœçXǵǃÇ≠ÇæÇ≥Ç¢ÅBǪÇÃåãâ ÅAéÛÇØéÊÇ¡ÇΩDTPPrinterInfoÇ…ÇÊǡǃéwíËÇ≥ÇÍÇÈÉvÉäÉìÉ^Ç™ÉhÉâÉCÉoÇÃåªç›ëIëÇ≥ÇÍǃǢÇÈÉvÉäÉìÉ^Ç…Ç»ÇËÇ‹Ç∑ÅB


ñ¢óàÇÕÇ∑ÇÆÇªÇ±Ç…Ç†ÇÈ
èâë„ÇÃÉoÉbÉNÉOÉâÉEÉìÉhàÛç¸ÇÉTÉ|Å[ÉgÇ∑ÇÈÉhÉâÉCÉoÇÇ∑Ç≈Ç…äJî≠ǵǃǢÇÈèÍçáÅAè´óàÇ…ÇÌÇΩǡǃå›ä∑ê´Çà€éùÇ∑ÇÈÇΩÇflÇÃç≈ëPÇÃëIëÇÕÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ÇÃÉTÉ|Å[ÉgÇí«â¡Ç∑ÇÈDZÇΔÇ≈Ç∑ÅBǵǩǵÅAÉoÉbÉNÉOÉâÉEÉìÉhàÛç¸ÇΔÇÃäiì¨ÇénÇflÇΩnjǩÇËÇ≈ÅAMac OS 8ÇÃÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ã@î\ÇÃÇ›ÇÉTÉ|Å[ÉgǵÇÊǧÇΔǵǃǢÇÈèÍçáÇÕÅAåªç›ÇÃÉfÉXÉNÉgÉbÉv•ÉvÉäÉìÉ^ã@î\Ç…â¡Ç¶Çƒèâë„ÇÃÉoÉbÉNÉOÉâÉEÉìÉhàÛç¸Ç‡ÉTÉ|Å[ÉgÇ∑ÇÈDZÇΔÇã≠Ç≠Ç®ä©ÇflǵNjÇ∑ÅBDZǧÇ∑ÇÍÇŒÅAé¿çsÇ∑ÇÈMac OSÇÃÉoÅ[ÉWÉáÉìÇ…ä÷åWÇ»Ç≠ÅAÉÜÅ[ÉUÇÕÇÊÇËàÍä—ǵÇΩàÛç¸ëÄçÏÇåoå±Ç≈Ç´ÇÈÇÊǧDžǻÇÈÇÕÇ∏Ç≈Ç∑ÅB